// store 的 state 数据
let state = {
  count: 1,
  msg: "~",
};

// 用于收集所有订阅者的一个数组
let listeners: any[] = [];

const store = {
  /**
   *
   * 当组件中调用 useSyncExternalStore(store.subscribe) 时，当前组件会构造出一个 listener 订阅者传递给 该 subscribe
   * @param listener 订阅者
   */
  subscribe(listener: any) {
    // 将当前 listener 收集到 listeners
    listeners.push(listener);

    // 返回一个函数，用于清理订阅
    return () => {
      console.log("清理订阅");
      listeners = listeners.filter((item) => item !== listener);
    };
  },

  /**
   * 用于获取该 store 的 state 的一个函数
   */
  getSnapshot() {
    return state;
  },

  dispatch(action) {
    console.log("action", action);
    // debugger;
    switch (action.type) {
      case "INCREMENT":
        // state.count++;
        state = {
          ...state,
          count: state.count + 1,
        };
        console.log("listeners", listeners);
        // 通知 订阅者们，数据变化了
        listeners.forEach((cb) => cb());
        // listeners[0]();
        break;
      case "DECREMENT":
        // state.count--;
        state = {
          ...state,
          count: state.count - 1,
        };
        // 通知 订阅者们，数据变化了
        listeners.forEach((cb) => cb());
        // listeners[0]();
        break;
      default:
        break;
    }
  },
};

export default store;
